#include <opencv2/opencv.hpp>
#include <iostream>

cv::Scalar brush_color = cv::Scalar(0, 0, 0);  // 初始画笔颜色为黑色
int brush_radius = 5;  // 初始画笔半径

// 回调函数
void nothing(int, void*) {
    // 空回调函数
}

// 鼠标回调函数
void draw_circle(int event, int x, int y, int flags, void* param) {
    cv::Mat& img = *(cv::Mat*)param;

    if (event == cv::EVENT_LBUTTONDOWN) {  // 鼠标左键按下
        cv::circle(img, cv::Point(x, y), brush_radius, brush_color, -1);  // 绘制实心圆
    }
    else if (event == cv::EVENT_MOUSEMOVE && (flags & cv::EVENT_FLAG_LBUTTON)) {  // 鼠标移动并按下左键
        cv::circle(img, cv::Point(x, y), brush_radius, brush_color, -1);  // 绘制实心圆
    }
}

int main() {
    // 创建一个黑色图像
    cv::Mat img = cv::Mat::zeros(600, 800, CV_8UC3);

    // 创建窗口
    std::string window_name = "Paint Program";
    cv::namedWindow(window_name);

    // 创建轨迹栏来调整画笔颜色 (RGB)
    int r = 0, g = 0, b = 0;
    cv::createTrackbar("R", window_name, &r, 255, nothing);
    cv::createTrackbar("G", window_name, &g, 255, nothing);
    cv::createTrackbar("B", window_name, &b, 255, nothing);

    // 创建轨迹栏来调整画笔半径
    cv::createTrackbar("Brush Size", window_name, &brush_radius, 50, nothing);

    // 设置鼠标回调
    cv::setMouseCallback(window_name, draw_circle, &img);

    while (true) {
        // 根据轨迹栏的值更新画笔颜色
        brush_color = cv::Scalar(b, g, r);

        // 显示当前图像
        cv::imshow(window_name, img);

        // 检测按键，按 ESC 键退出
        char k = (char)cv::waitKey(1);
        if (k == 27) {  // ESC 键退出
            break;
        }
    }

    // 释放资源并关闭窗口
    cv::destroyAllWindows();
    return 0;
}
